﻿using System;
using System.IO;
using System.IO.Enumeration;
using System.Threading;

namespace _048_多个线程同时写一个文件
{
    class Program
    {

        //声明两个只读字段为便于在main方法中访问，可以声明 为静态，分别输出文件名和要写入的9个字节
        static readonly string 文件名称 = "zoomlademo.data";
        static readonly byte[] 字节定列 =
        {
            0x0C,0x10,0x02,
            0xE3,0xB8,0xA2,
            0x13,0xB8,0x06
        };

        //声明一个数组作为静态字段，包含 三个元素 可以作为与线程相对应事件的句柄
        static AutoResetEvent[] 写入组 =
        {
            new AutoResetEvent(false),
            new AutoResetEvent(false),
            new AutoResetEvent(false)
        };

        static void Main(string[] args)
        {
            if (File.Exists(文件名称))
                File.Delete(文件名称);

            for (int i = 0; i < 3; i++)
            {
                Thread 写入 = new Thread((p) =>
                  {
                      //先把要写的字节复制过来
                      int 复制字节 = Convert.ToInt32(p);
                      int 拷贝操作 = 复制字节 * 3;
                      byte[] 字节组 = new byte[3];
                      Array.Copy(字节定列, 拷贝操作, 字节组, 0, 3);
                      //打开文件流
                      using (FileStream 打开文件流 = new FileStream(文件名称, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
                      {
                          //定位流的当前位置
                          打开文件流.Seek(拷贝操作, SeekOrigin.Begin);
                          //写入数据
                          打开文件流.Write(字节组, 0, 字节组.Length);
                      }
                      //发出信号
                      写入组[复制字节].Set();
                  });
                //标识为后台线程
                写入.IsBackground = true;
                //启动线程
                写入.Start(i);
            }

            Console.WriteLine($"原始字节序列：\n{BitConverter.ToString(字节定列)}");

            Console.WriteLine("等待所有线程完成文件写入……");
            WaitHandle.WaitAll(写入组);
            Console.WriteLine("文件写入完成。");

            //验证是否完成
            using (FileStream 验证是否完成 = new FileStream(文件名称,FileMode.Open))
            {
                byte[] 字节验证 = new byte[验证是否完成.Length];
                验证是否完成.Read(字节验证, 0, 字节验证.Length);
                Console.WriteLine($"从文件中读出的字节：\n{BitConverter.ToString(字节验证)}");
            }

        }

    }
}
